package chapter02.part01;

import chapter02.FileUtil;

import java.io.*;

/**
 * 组合输入输出流
 * 
 * @author insight
 * @since 2021/8/6
 */
public class CombineStream {
    public static void main(String[] args) throws IOException {
        // 可以通过嵌套流来添加额外功能
        
        // 比如从文件读取基本类型的数据
        FileOutputStream fout =
                FileUtil.getTestFileOutputStreamInstance();
        DataOutputStream dout = new DataOutputStream(fout);

        FileInputStream fin =
                FileUtil.getTestFileInputStreamInstance();
        DataInputStream din = new DataInputStream(fin);
        
        dout.writeDouble(1.23300);
        System.out.println(din.readDouble());
        
        // 输入流默认不带缓冲 可以结合缓冲
        // DataOutputStream 放在最后是因为需要使用它的功能
        // 且它能使用带有缓冲的 read() 和能做标记的 mark()
        // 好像由于文件指针的关系 不能直接使用fout再次新建 否则读取的是结尾
        /*dout = new DataOutputStream(
                new BufferedOutputStream(fout)
        );*/
        // 重新new 指向文件开头
        dout = new DataOutputStream(
                new BufferedOutputStream(new FileOutputStream
                        (FileUtil.TEST_FILE_PATH))
        );
        din = new DataInputStream(
                new BufferedInputStream(new FileInputStream
                        (FileUtil.TEST_FILE_PATH))
        );
        
        dout.writeUTF("12");
        // 注意需要使用 flush / close 来刷新缓冲区 否则写入失效
        dout.flush();
        System.out.println(din.readUTF());

        PushbackInputStream pbin = new PushbackInputStream(
                new BufferedInputStream(new FileInputStream
                        (FileUtil.TEST_FILE_PATH))
        );
        // 多次测试 dout.writeUTF("12")
        // 发现写入后 第1个字符固定空字符(0) 第2个字符记录总字符数(n)
        // 然后读取 n 次分别为写入的内容 最后为-1表示结尾
        System.out.println(pbin.read());
        System.out.println(pbin.read());
        System.out.println(pbin.read());
        // 修改的是缓冲区的内容 文件没有变化
        pbin.unread(55);
        System.out.println(pbin.read());
    }
}